<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>递归练习</title>
</head>
<body>
    <script>
    // 数组和对象才有深浅拷贝  基本类型没有
    // 递归
    function deepClone(obj){
        let cloneObj = Array.isArray(obj)?[]:{}
        for(let k in obj){
           
           if(obj.hasOwnProperty(k)){  //判断k是否是自身的属性
            if(typeof obj[k] === 'object'){ //判断是否是对象  是对象的的话 继续便利  
                cloneObj[k] = deepClone(obj[k])
            }else{
                cloneObj[k] = obj[k]  //不是的话 重新赋值
            }
           }
        }
        return cloneObj
    }

    let  obj = {
       a:'hello',
       b:{
        a:1
       }
    }
    let obj1 = deepClone(obj)
    obj.b.a = 2
    obj.a = '123'

    console.log(obj1)


    let arr = [1,2,3]
    let arr1 = arr
    arr.push(4)
    arr[1] = 0
    console.log(arr,arr1)


    function deepClone(obj){
        let cloneObj = Array.isArray(obj)?[]:{}
        for(let k in obj){
            console.log(k,'键值')
            if(obj.hasOwnProperty(k)){
                if(typeof obj[k] === 'object'){
                    cloneObj[k] = deepClone(obj[k])
                }else{
                    cloneObj[k] = obj[k]
                }
            }
        }
        return cloneObj;
    }


    // 原型和原型链
    function Person(){}
    Person.prototype.name = '大招'
    Person.prototype.a = function(){
       console.log('原型函数');        
    }
    var person1 = new Person();
    console.log(person1.name)
    person1.a()
     // 函数对象才有原型
    // js里万物皆对象，所以访问_proto_会产生一条原型链
    // 链条的尽头是null



    // 执行上下文
    var a = 0;
    function b(){
        var c 
        function d(){

        }
    }
    b()
    b()
    // 执行上下文和作用域
    // 函数定义时候作用域已经确定了

    const name ='张三'
    const age = '18'
    const obj3 = {
        name:'李四',
        fun:function(sex,hobby){
          console.log(`名字${this.name},性别${sex},年龄${this.age},爱好${hobby}`)
        }
    }
    const obj4={
        name:'王五',
        age:19
    }
    obj3.fun.call(obj4,'女','写代码')
    obj3.fun.apply(obj4,['女','写代码'])
    obj3.fun.bind(obj4,'女','写代码')()

    

    </script>
</body>
</html>